package com.it.gmall.activity.controller;

import com.it.gmall.activity.redis.CacheHelper;
import com.it.gmall.activity.service.ActivityService;
import com.it.gmall.activity.utils.DateUtil;
import com.it.gmall.common.constant.RedisConst;
import com.it.gmall.common.result.Result;
import com.it.gmall.common.result.ResultCodeEnum;
import com.it.gmall.common.util.AuthContextHolder;
import com.it.gmall.common.util.MD5;
import com.it.gmall.model.activity.SeckillGoods;
import org.hibernate.validator.internal.constraintvalidators.hv.pl.REGONValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@RestController
@RequestMapping("/api/activity")
public class ActivityController {
    @Autowired
    private ActivityService activityService;
    @Autowired
    private RedisTemplate redisTemplate;

    // 获取首页显示数据
    @GetMapping("/getIndexGoods")
    public List<SeckillGoods> getIndexGoods(){
        return activityService.getIndexGoods();
    }

    // 获取秒杀商品详情
    @GetMapping("/item/{skuId}")
    public SeckillGoods item(@PathVariable Long skuId){
        return activityService.item(skuId);
    }

    // 获取商品的抢购码(下单资格)
    /*有库存 审核通过 时间范围内*/
    @GetMapping("/seckill/auth/getSeckillSkuIdStr/{skuId}")
    public Result getSeckillSkuIdStr(@PathVariable Long skuId, HttpServletRequest request){
        String userId = AuthContextHolder.getUserId(request);
        // 获取商品
        SeckillGoods item = activityService.item(skuId);
        if(null==item){
            return Result.fail("当前商品不是秒杀商品");
        }
        if(!"1".equals(item.getStatus())){
            return Result.fail("当前商品审核未通过");
        }
        if(item.getStockCount()<=0){
            return Result.fail("当前商品库存不足");
        }
        /*在活动范围内的商品：
         * startTime <= now < endTime
         * date1 > date2  返回：1
         * date1 = date2  返回：0
         * date1 < date2  返回：-1*/
        Calendar instance = Calendar.getInstance();
        Date time = instance.getTime(); // 当前 年月日
        if(DateUtil.dateCompare(time,item.getStartTime())){ // 当前时间<开始时间
            return Result.fail("秒杀还没开始");
        }
        if(DateUtil.dateCompare(item.getEndTime(),time)){ // 当前时间 >= 结束时间
            return Result.fail("秒杀已经结束");
        }
        return Result.ok(MD5.encrypt(userId));
    }

    // 开始抢购商品(下单)
    @PostMapping("/seckill/auth/seckillOrder/{skuId}")
    public Result seckillOrder(@PathVariable Long skuId,String skuIdStr,HttpServletRequest request){
        String userId = AuthContextHolder.getUserId(request);
        String encrypt = MD5.encrypt(userId);

        // 校验是否有抢购资格
        if(StringUtils.isEmpty(skuIdStr)){
            return Result.build(null, ResultCodeEnum.SECKILL_ILLEGAL); // 217 请求不合法
        }
        if(!encrypt.equals(skuIdStr)){
            return Result.build(null, ResultCodeEnum.SECKILL_ILLEGAL); // 217 请求不合法
        }
        // 校验是否有库存 (校验状态位)
        Object o = CacheHelper.get(skuId.toString());
        if("1".equals(o)){ // 1:无库存 0:有库存
            return Result.build(null,ResultCodeEnum.SECKILL_FINISH); // 213 已售完
        }
        // 开始去mq中排队 削峰
        activityService.seckillOrder(skuId,skuIdStr,userId);
        return Result.ok();
    }

    // 查询抢购订单的结果 轮询 前台页面每3秒查询一次
    /*排队中 ： 正在秒杀中 : show=1
    * 抢购失败 ： 抢购信息 : show=2
    * 抢购成功 ： 去下单，获取到了抢购资格，但是还没下单 : show = 3
    * 抢购成功 ： 查看我的订单，获取到了抢购资格，已经下单 : show = 4*/
    @GetMapping("/seckill/auth/checkOrder/{skuId}")
    public Result checkOrder(@PathVariable Long skuId,HttpServletRequest request){
        // 用户id
        String userId = AuthContextHolder.getUserId(request);
        // 1.判断用户是否已经下单成功
        Object o = redisTemplate.opsForValue().get(RedisConst.SECKILL_USER_ORDERS + userId + ":" + skuId);
        if(o!=null){
            return Result.build(null,ResultCodeEnum.SECKILL_ORDER_SUCCESS); // 218 下单成功
        }
        // 2.判断用户是否来过
        Object o1 = redisTemplate.opsForValue().get(RedisConst.SECKILL_ORDERS_USERS + userId + ":" + skuId);
        if(o1!=null){
            // 用户是否有抢单资格
            Object o2 = redisTemplate.opsForValue().get(RedisConst.SECKILL_ORDERS + userId + ":" + skuId);
            if(o2!=null){
                // 有资格 抢单成功
                return Result.build(null,ResultCodeEnum.SECKILL_SUCCESS); // 215 抢单成功
            }else{
                // 没有资格 抢单失败
                return Result.build(null,ResultCodeEnum.SECKILL_FAIL); // 216 抢单失败
            }
        }else{
            // 用户没来过 可能在排队 也可能在校验状态位
            Object o2 = CacheHelper.get(skuId.toString());
            // 判断是否有货 没有货抢单失败
            if("1".equals(o2)){
                // 没货
                return Result.build(null,ResultCodeEnum.SECKILL_FINISH); // 213 已售完
            }else{
                // 有货 没下单过没有抢购资格
                return Result.build(null, ResultCodeEnum.SECKILL_RUN); // 211 正在排队中
            }
        }
    }
}
